import json
import pandas as pd
import re

def convert_point_list_to_csv(point_list_path, output_csv_path):
    """
    将 point_list.txt 转换为 CSV 文件
    :param point_list_path: 输入 point_list.txt 文件路径
    :param output_csv_path: 输出 CSV 文件路径
    """
    # -------------------------- 步骤1：读取并清洗 point_list 数据 --------------------------
    try:
        with open(point_list_path, 'r', encoding='utf-8') as f:
            # 读取文件内容，处理格式问题（修复单引号、中文逗号等）
            content = f.read()
            # 1. 将单引号替换为双引号（JSON 标准仅支持双引号）
            content = content.replace("'", '"')
            # 2. 去除中文逗号、中文冒号等非法字符（若存在）
            content = re.sub(r'，', ',', content)
            content = re.sub(r'：', ':', content)
            # 3. 处理 'dipict' 字段的中文值（若未加引号，补充双引号）
            content = re.sub(r'"dipict": ([^",]+)', r'"dipict": "\1"', content)
        
        # 解析 JSON 数据（此时内容已符合 JSON 格式）
        point_data = json.loads(content)
        print(f"成功读取 {len(point_data)} 个点位数据")

    except Exception as e:
        print(f"读取/解析 point_list 失败：{str(e)}")
        return

    # -------------------------- 步骤2：提取核心字段（适配前序定位代码需求） --------------------------
    # 前序代码需要的 CSV 格式：点位编号,横坐标X,纵坐标Y
    # 这里“点位编号”用 point_list 中的 "id"（如 id=0 → 点位编号 point_0）
    csv_data = []
    for point in point_data:
        # 提取字段并处理数据类型（确保 X/Y 为数值型，避免计算错误）
        point_id = f"point_{point['id']}"  # 点位编号格式统一为 "point_0", "point_1"...
        x = float(point['x'])  # 横坐标（原数据中 x 已为 float/字符串，转为 float）
        y = float(point['y'])  # 纵坐标（原数据中 y 部分为字符串，转为 float）
        
        csv_data.append({
            "点位编号": point_id,
            "横坐标X": x,
            "纵坐标Y": y
        })

    # -------------------------- 步骤3：生成 CSV 文件 --------------------------
    try:
        # 创建 DataFrame 并保存为 CSV
        df = pd.DataFrame(csv_data)
        df.to_csv(output_csv_path, index=False, encoding='utf-8-sig')
        print(f"CSV 文件已生成：{output_csv_path}")
        print("\nCSV 预览（前5行）：")
        print(df.head())

    except Exception as e:
        print(f"生成 CSV 失败：{str(e)}")
        return

# -------------------------- 主函数调用（修改路径为你的实际路径） --------------------------
if __name__ == "__main__":
    # 1. 输入：你的 point_list.txt 路径（如放在当前文件夹，直接写文件名）
    INPUT_POINT_LIST = "point_list.txt"
    # 2. 输出：生成的 CSV 路径（建议与前序定位代码的 POINT_COORDS_PATH 一致）
    OUTPUT_CSV = "point_coords.csv"

    # 执行转换
    convert_point_list_to_csv(INPUT_POINT_LIST, OUTPUT_CSV)